#include "Hash.h"

Hash::Hash()
{
    tamanho = 217;

    tabelaHash = new NoHash * [tamanho];


    for( int i = 0 ; i < tamanho ; i++ )
    {
         this->tabelaHash[i] = NULL;
    }


}

void Hash::insereHash( Identificador *a )
{
	int indice = retornaIndice( a->getVar() );

	if( this->tabelaHash[indice] == NULL )
	{
        NoHash *no = new NoHash();

        no->AddNo( a );

        this->tabelaHash[indice] = no;
    }
    else
    {
        NoHash *no = tabelaHash[indice];
        no->AddNo( a );
    }
}

int Hash::retornaIndice( string identificador )
{
	int alpha = 6;
	unsigned int h = 0;

	for ( unsigned int i = 0 ; i < identificador.length() ; i++ )
    {
			h = alpha * h + ( int ) identificador[i];
	}

	return h % tamanho;
}

Identificador* Hash::getHash( string identificador, int linha )
{
    int indice  = retornaIndice( identificador );

    NoHash * no = tabelaHash[indice];

     return no->getIdentificador( identificador, linha);
}

void Hash::mostraHash()
{
     for(int i = 0 ; i < this->tamanho ; i++ )
     {
          if( tabelaHash[i] != NULL )
          {
              cout << "Indice: " << i << endl;

              NoHash * no = tabelaHash[i];

              no->Mostra();
              cout<<endl;
          }
     }
}
